#include "kopiethread.h"
//
KopieThread::KopieThread(  ): QThread()
{
	Action = 0;
	cancel = false;
	//Globale Einstellungen
	QSettings GlobaleEinstellungen(QSettings::IniFormat, QSettings::SystemScope, "Gremmelsoft", "qmediacopy");
	//Filterliste für Bilder
	bool ok = GlobaleEinstellungen.contains("Filter/Bilder");
	FilterlisteBilder = GlobaleEinstellungen.value("Filter/Bilder").toString();
	if (!ok){
		FilterlisteBilder = "*.jpg,*.tif,*.png,*.gif";
		GlobaleEinstellungen.setValue("Filter/Bilder",FilterlisteBilder);
	}
	//Filterliste für Filme
	ok = GlobaleEinstellungen.contains("Filter/Filme");
	FilterlisteFilme = GlobaleEinstellungen.value("Filter/Filme").toString();
	if (!ok){
		FilterlisteFilme = "*.avi,*.mov,*.3gp,*mp4";
		GlobaleEinstellungen.setValue("Filter/Filme",FilterlisteFilme);
	}
	//Filterliste für zu löschende Eintraege
	ok = GlobaleEinstellungen.contains("Filter/Loeschen");
	FilterlisteLoeschen = GlobaleEinstellungen.value("Filter/Loeschen").toString();
	if (!ok){
		FilterlisteLoeschen = "";
		GlobaleEinstellungen.setValue("Filter/Loeschen",FilterlisteLoeschen);
	}

}
//

void KopieThread::run()
{
	cancel = false;
	if (Action == 1){
		qDebug() << "Dateiliste einlesen wird in seperatem Thread gestartet";
		DateilisteEinlesen();
	}
	else if (Action == 2){
		DateienKopieren(false);
	}
	else if (Action == 3){
		DateienKopieren(true);
	}
}

void KopieThread::DateilisteEinlesen()
{
	DateiListeBilder.clear();
	DateiListeFilme.clear();
	DateiListeLoeschen.clear();
	zaehler = 0;
	DirEinlesen(PfadSrc);
}


void KopieThread::DirEinlesen(QString dir)
{
	QDir d ( dir );
	if ( !d.exists() )
	{
		//QMessageBox::information( this, "Error", qApp->translate("Kann Verzeichniss >","Kann Verzeichniss >") + dir + qApp->translate("< nicht oeffnen","< nicht oeffnen"));
		//QMessageBox::information( this, "Error", "Kann Verzeichniss >" + dir + "< nicht oeffnen");
		return;
	}

	d.setFilter( QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoSymLinks | QDir::AllDirs );
	//dateiendung setzen
	QStringList filter;
	filter = FilterlisteBilder.split(",");
	d.setNameFilters(filter);

	//Liste Bilder
	const QFileInfoList list = d.entryInfoList();
	QFileInfo fi;

	for (int l = 0; l < list.size(); l++)
	{
		zaehler++;
		fi = list.at(l);
		if ( fi.fileName() == "." || fi.fileName() == ".."	)
			continue;
		else if ( fi.isDir() );
			//DirEinlesen( fi.absoluteFilePath() + "/" );
		else if( fi.isFile() ){
			DateiListeBilder.append( fi.absoluteFilePath() );
			//qDebug() << "Bild: " << fi.absoluteFilePath();
		}
		if (cancel){
			l = list.size();
		}
	}

	//Liste Filme
	filter.clear();
	filter = FilterlisteFilme.split(",");
	d.setNameFilters(filter);

	const QFileInfoList listFilm = d.entryInfoList();

	for (int l = 0; l < listFilm.size(); l++)
	{
		fi = listFilm.at(l);
		if ( fi.fileName() == "." || fi.fileName() == ".."	)
			continue;
		else if ( fi.isDir() );
			//DirEinlesen( fi.absoluteFilePath() + "/" );
		else if( fi.isFile() ){
			DateiListeFilme.append( fi.absoluteFilePath() );
			//qDebug() << "Film: " << fi.absoluteFilePath();
		}
		if (cancel){
			l = listFilm.size();
		}
	}

	//Liste zu löschender Dateien
	filter.clear();
	filter = FilterlisteLoeschen.split(",");
	d.setNameFilters(filter);

	const QFileInfoList listLoeschen = d.entryInfoList();

	for (int l = 0; l < listLoeschen.size(); l++)
	{
		fi = listLoeschen.at(l);
		if ( fi.fileName() == "." || fi.fileName() == ".."	)
			continue;
		else if ( fi.isDir() )
			DirEinlesen( fi.absoluteFilePath() + "/" );
		else if( fi.isFile() ){
			DateiListeLoeschen.append( fi.absoluteFilePath() );
			//qDebug() << "Loeschen: " << fi.absoluteFilePath();
		}
		if (cancel){
			l = listLoeschen.size();
		}
	}
}


QString KopieThread::getPfadSrc()
{
	return PfadSrc;
}


void KopieThread::setPfadSrc(QString value)
{
	PfadSrc = value;
}


void KopieThread::setAction(int value)
{
	Action = value;
}


int KopieThread::getAction()
{
	return Action;
}


int KopieThread::getBilderCount()
{
	return DateiListeBilder.count();
}


int KopieThread::getFilmeCount()
{
	return DateiListeFilme.count();
}


void KopieThread::stop(int value)
{
	// TODO
	cancel = true;
	Action = value;
}


bool KopieThread::isEmpty()
{
	if (DateiListeBilder.isEmpty() & DateiListeFilme.isEmpty() & DateiListeLoeschen.isEmpty()){
		return true;
	}
	else {
		return false;
	}
}


int KopieThread::getGesammtCount()
{
	return DateiListeBilder.count() + DateiListeFilme.count();// + DateiListeLoeschen.count();
}


bool KopieThread::DateienKopieren(bool verschieben)
{
	QString dst;
	QString verzeichnis_tmp;
	QString endung;
	QString LaufendeNummer;
	QString restzeit;
	QDir dir;
	QDateTime dt(QDateTime::currentDateTime ());
	bool fehler;
	QTime gesammtzeit;
	QTime einzelzeit;
	QTime intervall;
	int anzahlGesammt = 0;
	int anzahlKopiert = 0;
	int anzahlRest = 0;
	int itmp;
	int mittelwert = 0;
	int anzahlMittelwert = 10;
	QList<int> zeiten;
	
	gesammtzeit.start();
	einzelzeit.start();
	intervall.start();
	
	fehler = false;
	sFehler.clear();

	if (!DateiListeBilder.isEmpty()){
		//Zielpfad für Bilder
		QString verzeichnis = PfadBilderDst + QDir::separator() 
			+ dt.toString("yyyy_MM_dd---hh_mm_ss") + QDir::separator();
		
		//Verzeichniss erstellen wenn es nicht existiert
		if (! dir.exists(verzeichnis)){
			if (! dir.mkdir(verzeichnis)){
				sFehler.append("Kann Verzeichniss >" + verzeichnis + "< nicht erstellen\n");
				fehler = true;
			}
		}
		
		if (!fehler) {
			QImage image;
			anzahlGesammt = DateiListeBilder.count() + DateiListeFilme.count();
			anzahlRest = anzahlGesammt;
			anzahlMittelwert = int(anzahlGesammt / 10);
			if (anzahlMittelwert == 0)
				anzahlMittelwert = 1;
			//Bilder Kopieren/Verschieben
			for ( QStringList::Iterator it = DateiListeBilder.begin(); it != DateiListeBilder.end(); ++it ){
				endung = *it;
				endung = endung.right(endung.length()-endung.lastIndexOf('.'));
				LaufendeNummer.sprintf("_%.6d",Bildnummer);
				//Nach Datum sortieren
				if (DatumsOrdner){
					//Dateidatum auslesen
					QFileInfo fi(*it);
					QDateTime timecreated = fi.lastModified();
					verzeichnis_tmp = verzeichnis + timecreated.toString("yyyy_MM_dd") + QDir::separator();
					//wenn verzeichnis noch nicht existiert -> erstellen
					if (! dir.exists(verzeichnis_tmp)){
						if (! dir.mkdir(verzeichnis_tmp)){
							sFehler.append("Kann Verzeichniss >"+verzeichnis_tmp+"< nicht erstellen\n");
						}
					}
				}
				else {
					verzeichnis_tmp = verzeichnis;
				}
				dst = verzeichnis_tmp + Bildname + LaufendeNummer + endung;
		
				//Eigentlichen Kopieren
				QFile file(*it);
				zeiten.prepend(einzelzeit.elapsed());
				if (zeiten.size() > anzahlMittelwert) {
					itmp = 0;
					for (int i = 0; i < anzahlMittelwert; ++i){
						itmp += zeiten.at(i);
					}
					mittelwert = int(itmp/anzahlMittelwert);
				}
				if ( (intervall.elapsed() > 1000) & (mittelwert > 0) ){
					intervall.restart();
					restzeit = QString::number((mittelwert * anzahlRest) / 1000 + 1);
				}
				einzelzeit.restart();
				if (file.copy(dst)){
					if (verschieben){
						if (!file.remove()){
							sFehler.append("Kann Datei: " + file.fileName() + " nicht loeschen\n");
						}
					}
				}
				else {
					sFehler.append("Fehler beim Kopieren der datei: " + file.fileName() + "\n");
				}
				anzahlKopiert++;
				anzahlRest--;
				Bildnummer++;
				if (Bildvorschau){
					image.load(dst);
					//QSize size(labelBild -> width()-6,labelBild -> height()-6);
					QSize size(BildvorschauGroesse);
					image = image.scaled(size,Qt::KeepAspectRatio);
				}
				emit Sig_BildKopiert(dst, restzeit, image);
				if (cancel){
					break;
				}
			}
		}
	}

	if (!DateiListeFilme.isEmpty()){
		//Zielpfad für Filme
		QString verzeichnis = PfadFilmeDst + QDir::separator() 
			+ dt.toString("yyyy_MM_dd---hh_mm_ss") + QDir::separator();
	
		//Verzeichniss erstellen wenn es nicht existiert
		if (! dir.exists(verzeichnis)){
			if (! dir.mkdir(verzeichnis)){
				sFehler.append("Kann Verzeichniss >"+verzeichnis+"< nicht erstellen\n");
				fehler = true;
			}
		}
		
		if (!fehler) {
			//Filme Kopieren/Verschieben
			for ( QStringList::Iterator it = DateiListeFilme.begin(); it != DateiListeFilme.end(); ++it ){
				endung = *it;
				endung = endung.right(endung.length()-endung.lastIndexOf('.'));
				LaufendeNummer.sprintf("_%.6d",Filmnummer);
				//Nach Datum sortieren
				QFileInfo fi(*it);
				QDateTime timecreated = fi.lastModified();
				if (DatumsOrdner){
					//Dateidatum auslesen
					QFileInfo fi(*it);
					QDateTime timecreated = fi.lastModified();
					verzeichnis_tmp = verzeichnis + timecreated.toString("yyyy_MM_dd") + QDir::separator();
					//wenn verzeichnis noch nicht existiert -> erstellen
					if (! dir.exists(verzeichnis_tmp)){
						if (! dir.mkdir(verzeichnis_tmp)){
							sFehler.append("Kann Verzeichniss >"+verzeichnis_tmp+"< nicht erstellen\n");
							fehler = true;
						}
					}
				}
				else {
					verzeichnis_tmp = verzeichnis;
				}
				dst = verzeichnis_tmp + Filmname + LaufendeNummer 
					+ "__" + timecreated.toString("dd_MM_yyyy") + endung;
		
				//Eigentliches Kopieren
				zeiten.prepend(einzelzeit.elapsed());
				if (zeiten.size() > anzahlMittelwert) {
					itmp = 0;
					for (int i = 0; i < anzahlMittelwert; ++i){
						itmp += zeiten.at(i);
					}
					mittelwert = int(itmp/anzahlMittelwert);
				}
				if ( (intervall.elapsed() > 1000) & (mittelwert > 0) ){
					intervall.restart();
					restzeit = QString::number((mittelwert * anzahlRest) / 1000 + 1);
				}
				einzelzeit.restart();
				QFile file(*it);
				if (file.copy(dst)) {
					if (verschieben){
						if (!file.remove()){
							sFehler.append("Kann Datei: " + file.fileName() + " nicht loeschen\n");
						}
					}
				}
				else {
					sFehler.append("Fehler beim Kopieren der datei: " + file.fileName() + "\n");
				}
				
				Filmnummer++;
				if (cancel){
					break;
				}
				emit Sig_FilmKopiert(dst,restzeit);
			}
		}
	}
	

	//Dateien die zu löschen sind
	if (!DateiListeLoeschen.isEmpty()){
		for ( QStringList::Iterator it = DateiListeLoeschen.begin(); it != DateiListeLoeschen.end(); ++it ){
			QFile file(*it);
			if (verschieben){
				if (!file.remove()){
					sFehler.append("Kann Datei: " + file.fileName() + " nicht loeschen\n");
				}
				else 
					emit Sig_DateiGeloescht(dst,"1");
			}
			if (cancel){
				break;
			}
		}
	}

	//im Fehlerfall Fehlerliste senden
	if (!sFehler.isEmpty()){
		qDebug() << "Fehler vorhanden";
		emit Sig_Fehler(sFehler);
	}

	qDebug("Verbrauchte Zeit: %d ms", gesammtzeit.elapsed());
		
	return true;
}


void KopieThread::setPfadBilderDst(QString value)
{
	PfadBilderDst = value;
}


void KopieThread::setPfadFilmeDst(QString value)
{
	PfadFilmeDst = value;
}


void KopieThread::setBildnummer(int value)
{
	Bildnummer = value;
}


void KopieThread::setDatumsOrdner(bool value)
{
	DatumsOrdner = value;
}


void KopieThread::setBildname(QString value)
{
	Bildname = value;
}


void KopieThread::setFilmnummer(int value)
{
	Filmnummer = value;
}


void KopieThread::setFilmname(QString value)
{
	Filmname = value;
}


int KopieThread::getBildnummer()
{
	return Bildnummer;
}


int KopieThread::getFilmnummer()
{
	return Filmnummer;
}


void KopieThread::setBildvorschau(bool value)
{
	Bildvorschau = value;
}


void KopieThread::setBildvorschauGroesse(QSize value)
{
	BildvorschauGroesse = value;
}


int KopieThread::getZaehler()
{
	return zaehler;
}


int KopieThread::getLoeschenCount()
{
	return DateiListeLoeschen.count();
}

